/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年2月3日
 * 项目： rainhy-cores-core
 */
package com.rainhy.core.util;

import java.io.IOException;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.rainhy.core.exception.RainhyException;

/**
 * Json 工具类<br>
 * 如果使用此工具类请引入如下包:<br>
 * 
 * <pre>
 * jackson-core
 * jackson-databind
 * jackson-annotations
 * gson
 * </pre>
 * 
 * @author rain
 * @version [版本号, 2016年2月3日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class JsonUtils {
    
    /** 把 json 格式化后输出 */
    public static String format(String json) {
        GsonBuilder gsonBuilder = new GsonBuilder().setPrettyPrinting();    // 创建一个格式化的 Gson 建造者
        Gson gson = gsonBuilder.create(); // 创建 Gson
        JsonElement je = new JsonParser().parse(json);  // 解析 json
        return gson.toJson(je);
    }
    
    /** json 字符串转换成实体 */
    public static <T> T fromJson(String json, Class<T> t) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略不存在的属性反序列化
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);     // null 不序列化
        try {
            return mapper.readValue(json, t);
        } catch (IOException e) {
            throw new RainhyException(e, " Json 转换成实体异常!");
        }
    }
    
    /** json 字符串转换成实体集合 */
    @SuppressWarnings("unchecked")
    public static <T> List<T> fromJsonForRootIsList(String json, Class<T> elementClass) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略不存在的属性反序列化
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);     // null 不序列化
        TypeFactory typeFactory = mapper.getTypeFactory();
        CollectionType javaType = typeFactory.constructCollectionType(List.class, elementClass);
        try {
            return (List<T>) mapper.readValue(json, javaType);
        } catch (IOException e) {
            throw new RainhyException(e, "Json 转换成实体异常!");
        }
    }
    
    /** 实体转成 json 字符串 */
    public static String toJson(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略不存在的属性反序列化
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);     // null 不序列化
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RainhyException(e, "实体转换成 Json 异常!");
        }
    }
}
